/**
 * 分享服务工具类
 * 封装微信小程序分享功能，支持分享到好友、朋友圈等
 */
class ShareService {
	constructor() {
		this.init()
	}

	init() {
		// 分享配置
		this.shareConfig = {
			appName: '合一个',
			appDesc: '基于传统智慧的现代解读',
			defaultImage: '/static/icons/logo.png'
		}
	}

	/**
	 * 生成分享内容
	 * @param {Object} data 分享数据
	 * @returns {Object} 分享内容
	 */
	generateShareContent(data) {
		const {
			type = 'hexagram',
			title = '',
			description = '',
			hexagram = null,
			question = '',
			imageUrl = '',
			path = ''
		} = data

		let shareTitle = title || this.shareConfig.appName
		let shareDesc = description || this.shareConfig.appDesc
		let shareImageUrl = imageUrl || this.shareConfig.defaultImage
		let sharePath = path || '/pages/index/index'

		// 根据不同类型生成分享内容
		switch (type) {
			case 'hexagram':
				if (hexagram) {
					shareTitle = `我占得"${hexagram.name}"卦`
					shareDesc = question ? `问题：${question}` : `${hexagram.description}`
					sharePath = `/pages/hexagram-detail/hexagram-detail?hexagram=${encodeURIComponent(JSON.stringify(hexagram))}`
				}
				break
			case 'result':
				if (hexagram && question) {
					shareTitle = `${question} - ${hexagram.name}`
					shareDesc = `使用"${this.shareConfig.appName}"占卜获得指引`
				}
				break
			case 'app':
				shareTitle = this.shareConfig.appName
				shareDesc = this.shareConfig.appDesc
				sharePath = '/pages/index/index'
				break
		}

		return {
			title: shareTitle,
			desc: shareDesc,
			path: sharePath,
			imageUrl: shareImageUrl
		}
	}

	/**
	 * 分享给微信好友
	 * @param {Object} shareData 分享数据
	 * @returns {Promise}
	 */
	shareToFriend(shareData) {
		return new Promise((resolve, reject) => {
			try {
				const content = this.generateShareContent(shareData)
				
				// 在小程序环境中，使用微信分享API
				if (typeof uni.share !== 'undefined') {
					uni.share({
						provider: 'weixin',
						scene: 'WXSceneSession', // 分享到聊天
						type: 0,
						title: content.title,
						summary: content.desc,
						imageUrl: content.imageUrl,
						href: content.path,
						success: () => {
							console.log('ShareService - 分享给朋友成功')
							resolve(content)
						},
						fail: (error) => {
							console.error('ShareService - 分享给朋友失败:', error)
							reject(error)
						}
					})
				} else {
					// 在H5环境中，使用复制链接的方式
					this.copyShareLink(shareData)
						.then(resolve)
						.catch(reject)
				}
			} catch (error) {
				console.error('ShareService - 分享给朋友失败:', error)
				reject(error)
			}
		})
	}

	/**
	 * 分享到朋友圈
	 * @param {Object} shareData 分享数据
	 * @returns {Promise}
	 */
	shareToMoments(shareData) {
		return new Promise((resolve, reject) => {
			try {
				const content = this.generateShareContent(shareData)
				
				// 在小程序环境中，使用微信分享API
				if (typeof uni.share !== 'undefined') {
					uni.share({
						provider: 'weixin',
						scene: 'WXSceneTimeline', // 分享到朋友圈
						type: 0,
						title: content.title,
						summary: content.desc,
						imageUrl: content.imageUrl,
						href: content.path,
						success: () => {
							console.log('ShareService - 分享到朋友圈成功')
							resolve(content)
						},
						fail: (error) => {
							console.error('ShareService - 分享到朋友圈失败:', error)
							reject(error)
						}
					})
				} else {
					// 在H5环境中，使用复制链接的方式
					this.copyShareLink(shareData)
						.then(resolve)
						.catch(reject)
				}
			} catch (error) {
				console.error('ShareService - 分享到朋友圈失败:', error)
				reject(error)
			}
		})
	}

	/**
	 * 复制分享链接
	 * @param {Object} shareData 分享数据
	 * @returns {Promise}
	 */
	copyShareLink(shareData) {
		return new Promise((resolve, reject) => {
			try {
				const content = this.generateShareContent(shareData)
				const shareText = `${content.title}\n${content.desc}\n\n来自"${this.shareConfig.appName}"小程序`
				
				uni.setClipboardData({
					data: shareText,
					success: () => {
						uni.showToast({
							title: '已复制到剪贴板',
							icon: 'success'
						})
						resolve(shareText)
					},
					fail: (error) => {
						console.error('ShareService - 复制失败:', error)
						uni.showToast({
							title: '复制失败',
							icon: 'none'
						})
						reject(error)
					}
				})
			} catch (error) {
				console.error('ShareService - 复制分享链接失败:', error)
				reject(error)
			}
		})
	}

	/**
	 * 生成分享海报
	 * @param {Object} shareData 分享数据
	 * @returns {Promise}
	 */
	generateSharePoster(shareData) {
		return new Promise((resolve, reject) => {
			try {
				// 这里可以调用海报生成组件
				// 或者使用 canvas 生成海报图片
				console.log('ShareService - 生成分享海报:', shareData)
				
				uni.showToast({
					title: '海报生成功能开发中',
					icon: 'none'
				})
				
				// 模拟生成过程
				setTimeout(() => {
					resolve('/static/temp/poster.jpg')
				}, 1000)
			} catch (error) {
				console.error('ShareService - 生成海报失败:', error)
				reject(error)
			}
		})
	}

	/**
	 * 保存图片到相册
	 * @param {String} imageUrl 图片路径
	 * @returns {Promise}
	 */
	saveImageToAlbum(imageUrl) {
		return new Promise((resolve, reject) => {
			uni.authorize({
				scope: 'scope.writePhotosAlbum',
				success: () => {
					uni.saveImageToPhotosAlbum({
						filePath: imageUrl,
						success: () => {
							uni.showToast({
								title: '已保存到相册',
								icon: 'success'
							})
							resolve(imageUrl)
						},
						fail: (error) => {
							console.error('ShareService - 保存图片失败:', error)
							uni.showToast({
								title: '保存失败',
								icon: 'none'
							})
							reject(error)
						}
					})
				},
				fail: () => {
					uni.showModal({
						title: '权限提醒',
						content: '需要相册权限才能保存图片',
						confirmText: '去设置',
						success: (res) => {
							if (res.confirm) {
								uni.openSetting()
							}
						}
					})
					reject(new Error('缺少相册权限'))
				}
			})
		})
	}

	/**
	 * 获取当前页面路径和参数
	 * @returns {String} 页面路径
	 */
	getCurrentPagePath() {
		try {
			const pages = getCurrentPages()
			const currentPage = pages[pages.length - 1]
			let path = '/' + currentPage.route
			
			// 添加页面参数
			const options = currentPage.options
			if (options && Object.keys(options).length > 0) {
				const params = Object.entries(options)
					.map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
					.join('&')
				path += `?${params}`
			}
			
			return path
		} catch (error) {
			console.error('ShareService - 获取页面路径失败:', error)
			return '/pages/index/index'
		}
	}

	/**
	 * 统一分享入口
	 * @param {String} platform 分享平台 'friend'|'moments'|'copy'|'poster'
	 * @param {Object} shareData 分享数据
	 * @returns {Promise}
	 */
	share(platform, shareData) {
		switch (platform) {
			case 'friend':
				return this.shareToFriend(shareData)
			case 'moments':
				return this.shareToMoments(shareData)
			case 'copy':
				return this.copyShareLink(shareData)
			case 'poster':
				return this.generateSharePoster(shareData)
			default:
				return Promise.reject(new Error(`不支持的分享平台: ${platform}`))
		}
	}

	/**
	 * 设置页面分享菜单
	 * @param {Object} shareData 分享数据
	 */
	setPageShareMenu(shareData) {
		try {
			// 显示分享按钮
			uni.showShareMenu({
				withShareTicket: true
			})

			// 设置分享内容
			const content = this.generateShareContent(shareData)
			
			// 分享给朋友
			uni.onShareAppMessage(() => {
				return {
					title: content.title,
					path: content.path,
					imageUrl: content.imageUrl
				}
			})

			// 分享到朋友圈（需要基础库 2.11.3 以上）
			if (uni.onShareTimeline) {
				uni.onShareTimeline(() => {
					return {
						title: content.title,
						path: content.path,
						imageUrl: content.imageUrl
					}
				})
			}
		} catch (error) {
			console.error('ShareService - 设置页面分享菜单失败:', error)
		}
	}
}

export { ShareService }
export default ShareService